package qdu.rg012.ch4_sqlite;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.annotation.Nullable;
import android.util.Log;

public class My_dbadptor {
    /**
     * 1. 准备建库建表 数据信息
     * 2. 准备数据库连接的帮助类 SQLiteOpenHelper,一般是定义其子类并重写相关函数
     *    2.1 父类构造函数调用
     *        参数1：当前数据库所依附的app环境
     *        参数2：数据库文件名称
     *        参数3：cursor factory
     *        参数4：版本
     *
     *    2.2 onCreate,该函数在第一次连接数据库时回调，若连接数据库时，数据库已经存在不再回调
     *        一般在该函数中建表。
     *    2.3 onupgrade与oncreate回调时机相同，一般用来更新数据库
     *
     *3. 连接数据库，通过step2准备的帮助类对象的成员函数来获取数据库连接
     *    getWritableDatabase / getReadableDatabase
     *    在连接时会判断是否已经创建数据库文件，若没有则调用2.1中的构造函数
     *    若非第一次连接则不再回调2.2的oncreate
     *
     */
    //准备数据库相关的基本信息，包括文件名、表名称、列名称等
    private static final String DB_NAME = "people2.db";
    private static final int DB_VERSION = 1;
    private static final String TB_NAME1 = "peopleinfo";

    public static final String KEY_ID = "_id";
    //sqlite中主键默认名称为 _id
    public static final String KEY_NAME = "name";
    public static final String KEY_AGE = "age";
    public static final String KEY_HEIGHT = "height";
    Context mc;
    Mydbhelper mydbhelper;
    SQLiteDatabase sqdb;
    public My_dbadptor(Context mc) {
        this.mc = mc;
    }
    public void opendb(){
        mydbhelper = new Mydbhelper(mc, DB_NAME, null, DB_VERSION);//创建数据库帮助类的对象
        if(mydbhelper != null){
            sqdb = mydbhelper.getWritableDatabase();
            if(sqdb == null){
                sqdb = mydbhelper.getReadableDatabase();
            }
        }
    }
    @SuppressLint("Range")
    public String getall(){
        /**
         * SqliteDatabase的query函数对应查询操作
         * 参数1：表名称； 参数2：查询哪些列； 参数3： 与sql中where语法相关 参数4：与参数3where中的？符号对应匹配的值
         * 参数....
         * query函数返回的结果是以cursor类型的游标来访问
         * 控制cursor游标常用的函数 getCount moveToFirst  getColumnIndex  getString等
         */
        String result = "";
        if(sqdb != null && sqdb.isOpen()){
            Cursor cursor =  sqdb.query(TB_NAME1, null, null, null, null, null, null);

            if(cursor != null & cursor.moveToFirst()) {
                Log.i("mytag", "count:" + cursor.getCount());
                //cursor.moveToFirst();
                for (int i = 0; i < cursor.getCount(); i++) {
                    result += "id: " + cursor.getString(0) + " | " +
                            "name: " + cursor.getString(cursor.getColumnIndex(KEY_NAME)) + " | " +
                            "age: " + cursor.getString(cursor.getColumnIndex(KEY_AGE)) + " | " +
                            "height: " + cursor.getString(cursor.getColumnIndex(KEY_HEIGHT)) + '\n';
                    cursor.moveToNext();
                }
            }
        }
        return result;
    }
    public void closedb(){
        if(sqdb != null && sqdb.isOpen()) {
            sqdb.close();
            sqdb = null;
        }
    }
    class Mydbhelper extends SQLiteOpenHelper{

        public Mydbhelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            /*
            create table peopleinfo (
                _id integer primary key autoincrement,
                name text not null,
                age integer,
                height float
            );
             */
            if(db!=null){
                String sql = "create table " + TB_NAME1 + " ( "
                        + KEY_ID + " integer primary key autoincrement,"
                        + KEY_NAME + " text not null,"
                        + KEY_AGE + " integer,"
                        + KEY_HEIGHT + " float);";
                db.execSQL(sql);
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            //1 droptable （dump）
            //2 re-createtable
        }
    }
}
